perm filename CONTXT.MAC[11,HE] blob sn#494240 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
	.TITLE	CONTXT
	.DSABL	GBL

	.CSECT	GLOBAL
G=.
.=G+125.+125.
	.WORD	INCON
	.WORD	CALCON
	.WORD	BLOCK

	.CSECT

;
;CONTEXT DATA STRUCTURE
;
NEXT=0			;FORWARD LINK TO NEXT CONTEXT
STACK=2			;SAVED STACK POINTER (R0)
PROC=4			;PROCEDURE STARTING ADDRESS
EXSPAC=6 		;SPACE FOR PASSING ARGUMENTS
;
;STACK FOR USE OF THIS ROUTINE
;
MYSTAK:	.WORD	STKEND	;SAVED STACK POINTER
	.BLKW	20.	;STACK
STKEND=.		;END OF STACK
	.PAGE
;
;SUBROUTINE INITIALIZECONTEXT(REGION,LENGTH,PROC,EXTRASPACE) = CTX
;
INCON::
	MOV	R1,-(SP)
	ASL	R1
	CLR	NEXT(R1)		;NO FWD LINK
	ASL	R2			;LENGTH I	DACTES
	ADD	R1,R2			;END OF REGION
	MOV	#START,-(R2)		;PUSH STARTING ADDRESS
	MOV	R2,STACK(R1)		;SAVE STACK POINTER
	MOV	R3,PROC(R1)		;SAVE PROC STARTING ADDRESS
	MOV	(SP)+,R1		;R1 = CTX POINTER
	ADD	#2,(SP)
	RTS	PC			;RETURN
	.PAGE
;
;SUBROUTINE CALLCONTEXTLIST(CTX)
;
CALCON::
	SUB	@0(SP),R0		;
	MOV	(SP)+,-(R0)		;
	MOV	R0,R3			;SAVE CALLER'S STACK POINTER
	MOV	MYSTAK,R0		;	IN MY STACK
	MOV	R3,-(R0)		;PUSH R3(CALLER'S R0)
	BR	NXTCTX			;EXECUTE FIRST CONTEXT
;
;SUBROUTINE BLOCK()
;
BLOCK::
	SUB	@0(SP),R0		;
	MOV	(SP)+,-(R0)		;
	MOV	R0,R3			;SAVE CALLER'S STACK POINTER
	MOV	MYSTAK,R0		;	IN HIS CONTEXT AREA
	MOV	(R0)+,R1		;PULL ADDR OF RUNNING CONTEXT
	MOV	R3,STACK(R1)		;
	MOV	NEXT(R1),R1		;GET NEXT CONTEXT ON QUEUE
	BEQ	DONCTX			;NO MORE ON LIST TO RUN
;
;RESUME NEXT CONTEXT ON LIST
;
NXTCTX:
	ASL	R1			;
	MOV	R1,-(R0)		;PUSH ADDR OF RUNNING CONTEXT
	MOV	R0,MYSTAK		;SAVE MY STACK POINTER
	MOV	STACK(R1),R0		;SETUP CONTEXT STACK POINTER
	MOV	(R0)+,R5		;RESUME PROC(CTX)
	ADD	(R5)+,R0
	JMP	(R5)
;
;RETURN TO CALLER AFTER LAST CONTEXT ON QUEUE
;
DONCTX:
	MOV	(R0)+,R3		;PULL CALLER'S STACK POINTER
	MOV	R0,MYSTAK		;	FROM MY STACK
	MOV	R3,R0			;SETUP CALLER'S STACK POINTER
	MOV	(R0)+,R5		;RETURN TO CALLER
	ADD	(R5)+,R0
	JMP	(R5)
;
;ROUTINE FOR STARTING AND RESTARTING A PROCEDURE
;
RESTRT:
	MOV	@MYSTAK,R2		;R2 = CTX ADDRESS
	MOV	R2,R1			;
	CLC				;
	ROR	R1			;R1 = CTX POINTER
	JSR	PC,@PROC(R2)		;EXECUTE PROCEDURE
	.WORD	0
START=.-2				;ROUTINE RETURNS HERE
	BR	RESTRT			;RESTART IF PROC RETURNS
	.END